<?php

include_once MODELS."tipo-produto.php";
include_once MODELS."marca.php";

class ProdutoModel extends Database {
    
    const TABLE = "produto";
    
    const ID = "id";
    const CODIGO = "cod_produto";
    const DESCRICAO = "descricao";
    const PRECO_COMPRA = "preco_compra";
    const PRECO_VENDA = "preco_venda";
    const PRECO_VENDA_MIN = "preco_venda_min";
    const TIPO = "id_tipo_produto";
    const MARCA = "id_marca_produto";
    
    public function select($fields = " * ", $condition = null, $limit = null) {
        if(is_array($fields)) $fields = implode(",", $fields);
        $res = parent::select(self::TABLE, $fields, $condition, $limit);
        $ana = $this->getAnnalisses();
        $produtos = array();
        while(($row = $ana->fetchObject($res)) !== false){
            $produtos[] = new Produto(
                                isset($row->{ self::ID })? $row->{ self::ID } : 0,
                                isset($row->{ self::CODIGO })? $row->{ self::CODIGO } : "",
                                isset($row->{ self::DESCRICAO })? ($row->{ self::DESCRICAO }) : "",
                                isset($row->{ self::PRECO_COMPRA })? $row->{ self::PRECO_COMPRA } : 0,
                                isset($row->{ self::PRECO_VENDA })? $row->{ self::PRECO_VENDA } : 0,
                                isset($row->{ self::PRECO_VENDA_MIN })? $row->{ self::PRECO_VENDA_MIN } : 0,
                                isset($row->{ self::TIPO })? $row->{ self::TIPO } : 0,
                                isset($row->{ self::MARCA })? $row->{ self::MARCA } : 0 
                                );
        }
        return $produtos;
    }
    
    public function superSelect($condition = null, $limit = null){
        
        $fields = array( self::TABLE.".".self::ID, self::CODIGO, self::DESCRICAO,
                         self::PRECO_COMPRA, self::PRECO_VENDA, self::PRECO_VENDA_MIN,
                         TipoProdutoModel::NOME, MarcaModel::NOME);
        $fields_joined = implode(",", $fields);
        
        $this_condition = self::TIPO." = ".TipoProdutoModel::TABLE.".".TipoProdutoModel::ID;
        $this_condition .= " AND ".self::TABLE.".".self::MARCA." = ".MarcaModel::TABLE.".".MarcaModel::ID;
        
        if(is_null($condition)) $condition = $this_condition;
        else $condition .= " AND ".$this_condition;
        
        $tables = implode(",", array(self::TABLE, TipoProdutoModel::TABLE, MarcaModel::TABLE));
        
        $res = parent::select($tables, $fields_joined, $condition, $limit);
        $ana = $this->getAnnalisses();
        
        $produtos = array();
        while(($row = $ana->fetchObject($res)) !== false){
            $produtos[] = new Produto(
                                $row->{ self::ID },
                                $row->{ self::CODIGO },
                                ($row->{ self::DESCRICAO }),
                                $row->{ self::PRECO_COMPRA },
                                $row->{ self::PRECO_VENDA },
                                $row->{ self::PRECO_VENDA_MIN },
                                ($row->{ TipoProdutoModel::NOME }),
                                ($row->{ MarcaModel::NOME }) 
                                );
        }
        return $produtos;
    }
    
    public function insert(Produto $produto){
        $values = get_object_vars($produto);
        unset($values["id"]);
        $fields = implode(",", array( self::CODIGO, self::DESCRICAO, self::PRECO_COMPRA,
                                      self::PRECO_VENDA, self::PRECO_VENDA_MIN,
                                      self::TIPO, self::MARCA ));
        return parent::insert(self::TABLE, $fields, Database::turnInValues($values));
    }
    
    public function update(Produto $produto){
         $dic = array(
            self::CODIGO => $produto->codigo,
            self::DESCRICAO => $produto->descricao,
            self::PRECO_COMPRA => $produto->precoCompra,
            self::PRECO_VENDA => $produto->precoVenda,
            self::PRECO_VENDA_MIN => $produto->precoVendaMin,
            self::TIPO => $produto->tipo,
            self::MARCA => $produto->marca
        );
        $condition = self::ID." = ".$produto->id;
        return parent::formattedUpdates(self::TABLE, Database::turnInUpdateValues($dic), $condition);
    }

    public function delete($id_produto){
        $condition = self::ID." = $id_produto";
        return parent::delete(self::TABLE, $condition);
    }
    
    public function handleError() {
        $err_code = $this->errorCode(); 
        if($err_code == Annalisses::ERR_DUPLICATE) return "Não pode haver produto duplicado";
        return parent::handleError();
    }
} 
?>
